/**
 * 给定数组A，和K次操作，每次可以在当前数组中选择两个元素，并将其绝对值之差插入数组尾部。
 * 问K次操作后数组元素可能的最小值最小是多少。
 * N在2E3，显然是平方算法
 * 如果K大于等于3，肯定是0。因为前2次操作可以选一模一样的数对，第3次操作选前2次的结果相减即可
 * 1和2只需要分情况讨论即可。
 * 1比较简单，将A的两两之差做出来，返回A本身与两两之差中最小的即可
 * 当K=2时，还需要将A与差再做一次差，如果直接做的话就达到了立方，会T
 * 对差进行排序，对每个Ai，只需找最近的差再做差即可
 * O(N^2log(N^2)+Nlog(N^2))
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;

int N, K;
vector<llt> A;

llt proc(){
    if(K >= 3) return 0;

    sort(A.begin(), A.end());
    A.erase(unique(A.begin(), A.end()), A.end());
    int n = A.size();
    if(n != N) return 0LL;
    
    llt ans = *A.begin();
    vector<llt> cha; cha.reserve(n * n / 2 + 10);
    for(int i=0;i<n;++i)for(int j=i+1;j<n;++j){
        llt tmp = abs(A[i] - A[j]);
        ans = min(ans, tmp);
        if(0 == ans) return 0;
        cha.push_back(tmp);
    }

    if(1 == K) return ans;

    sort(cha.begin(), cha.end());
    cha.erase(unique(cha.begin(), cha.end()), cha.end());

    for(auto i : A){
        auto p = equal_range(cha.begin(), cha.end(), i);
        if(p.first != p.second) return 0;
        if(p.second != cha.end()) ans = min(ans, *p.second - i);
        if(p.second != cha.begin()) ans = min(ans, i - *(p.second - 1));
    }
    return ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofakse = 1;
    cin >> nofakse;
    while(nofakse--){
        cin >> N >> K;
        A.assign(N, 0);
        for(auto & i : A) cin >> i;
        cout << proc() << endl;
    }
    return 0;
}